// Server SAFE VERSION!!!
// Año: 2011
// Autor: Eduardo Sanchez

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "server.h"


#pragma pack(1)
typedef struct {
    uint16_t num;
    char letra;
} datos;



int mostrar_datos(datos d){
    printf("Num = %d (= %x), letra = %c\n", d.num, d.num, d.letra);
    printf("Tamaño de la estructura = %lu\n", sizeof(datos));
    return 0;
}



// Core section

int main(int argc, char *argv[])
{
    int s, sa;
    size_t ret;
    short num;
    datos data;


    s = give_me_a_socket_ready();
    if (s<0) 
    { printf("Abortando!!\n");
      return -1;
    }
    printf("Servidor listo y esperando por conexiones nuevas en el puerto %d\n",SERVER_PORT);

    while(1){
        sa = wait_for_new_connection(s);
        if (sa!=0)
        {
            printf("\n* * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
            // Bloquea hasta recibir
            ret = recv(sa, &data, sizeof(datos), 0);
            printf("Recibiendo datos del cliente Formato Red:\n");
            printf("La estructura tiene %lu bytes y se leyeron %lu bytes.\n", sizeof(datos),ret);
            mostrar_datos(data);
            printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");


            //Convierte los datos de Red a Host:
            data.num = ntohs(data.num);
           // data.letra=?
            printf("Datos del cliente Formato Host:\n");
            mostrar_datos(data);
            printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");


            // Modifica los datos que le llegaron
            data.num++;
            data.letra='r';

            //Convierte los datos de Host a Red:
            data.num = htons(data.num);
            // Envia la modificacion al servidor
            printf("Enviando datos al cliente Formato Red:\n");
            ret = send(sa, &data, sizeof(datos), 0);
            mostrar_datos(data);
            printf("La estructura tiene %lu bytes y se leyeron %lu bytes.\n", sizeof(datos),ret);
            printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n");
            close(sa);
        }
    }
    return 0;
}
